﻿#include "SList.h"

SLTNode* SLTNodeBuild(DataType input) {
	SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode));
	newNode->data = input;
	newNode->next = NULL;

	return newNode;

}

void SLTPrint(SLTNode* phead) {
	SLTNode* pcur = phead;
	while (pcur) {
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL\n");
}
/****************************************************************************************/
void SLTInsetFront(SLTNode** pphead, DataType input) {
	assert(pphead);

	SLTNode* newNode = SLTNodeBuild(input);
	//新节点必须先指向*pphead，再给*pphead赋值，否则先赋值的话，*pphead之后的原始数据丢失！
	newNode->next = *pphead;
	*pphead = newNode;
}


void SLTInsetBack(SLTNode** pphead, DataType input) {
	assert(pphead);
	assert(*pphead);

	SLTNode* newNode = SLTNodeBuild(input);

	//链表为空 新节点就是首节点
	if (*pphead == NULL) {
		*pphead = newNode;
		return;
	}
	//链表不为空 找尾节点
	SLTNode* ptail = *pphead;
	while (ptail->next) {
		ptail = ptail->next;
	}
	ptail->next = newNode;//ptail就是尾节点

}

void SLTInsetPosFront(SLTNode** pphead, SLTNode* pos, DataType input) {
	assert(pphead);
	assert(pos);

	SLTNode* newNode = SLTNodeBuild(input);
	//pos刚好在第一个位置 头插
	if (*pphead == pos) {
		SLTInsetFront(pphead, input);
		return;
	}
	//pos不在第一个位置

	SLTNode* prev = *pphead;
	while (prev->next != pos) {
		prev = prev->next;
	}
	//prev->newNode->next
	prev->next = newNode;
	newNode->next = pos;
}

void SLTInsetPosBack(SLTNode* pos, DataType input) {
	assert(pos);

	SLTNode* newNode = SLTNodeBuild(input);
	newNode->next = pos->next;
	pos->next = newNode;
}

/****************************************************************************************/

void SLTDeleteFront(SLTNode** pphead) {
	assert(pphead);
	assert(*pphead);

	//让第二个节点成为新的头 释放第一个节点
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;

}

void SLTdeletetBack(SLTNode** pphead) {
	assert(pphead);
	assert(*pphead);//指向第一个节点的地址

	//只有一个节点
	if ((*pphead)->next == NULL) {
		free(*pphead);
		*pphead = NULL;
		return;
	}
	//链表节点数大于一
	SLTNode* prev = NULL;
	SLTNode* ptail = *pphead;
	while (ptail->next) {
		prev = ptail;//存储尾节点之前的数据
		ptail = ptail->next;//遍历链表寻找尾节点
	}
	prev->next = NULL;
	//销毁尾节点
	free(ptail);
	ptail = NULL;
}

void SLTDeletePos(SLTNode** pphead, SLTNode* pos) {
	assert(pphead);
	assert(*pphead);
	assert(pos);

	//pos刚好是第一个节点 头删
	if (pos == *pphead) {
		SLTDeleteFront(pphead);
		return;
	}
	//pos不是第一个节点
	SLTNode* prev = *pphead;
	while (prev->next != pos) {
		prev = prev->next;
	}
	prev->next = pos->next;
	free(pos);
	pos = NULL;
}

void SLTDeletePosBack(SLTNode* pos) {
	assert(pos);
	assert(pos->next);//判断pos之后是否还有节点

	SLTNode* del = pos->next;
	pos->next = pos->next->next;
	free(del);
	del = NULL;
}


/****************************************************************************************/

SLTNode* SLTFind(SLTNode** pphead, DataType target) {
	assert(pphead);

	SLTNode* pcur = *pphead;
	while (pcur) {
		if (pcur->data == target) {
			/*printf("successfully finding!\n");*/
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}


void SLTDestory(SLTNode** pphead) {
	assert(pphead);
	assert(*pphead);

	SLTNode* pcur = *pphead;
	while (pcur) {
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}